\begin{Exercise}[title={指针},difficulty=1]
\label{ex:pointers}

\Question
假设定义了下面的结构：
\begin{lstlisting}
type Person struct {
    name string
    age	 int
}
\end{lstlisting}

下面两行之间的区别是什么？
\begin{lstlisting}
var p1 Person
p2 := new(Person)
\end{lstlisting}

\Question
下面两个内存分配的区别是什么？
\begin{lstlisting}[numbers=none]
func Set(t *T) {
    x = t
}
\end{lstlisting}
和
\begin{lstlisting}[numbers=none]
func Set(t T) {
    x= &t
}
\end{lstlisting}
\end{Exercise}

\begin{Answer}
\Question
第一行：\lstinline{var p1 Person} 分配了
\texttt{Person}-\emph{值} 给 \var{p1}。\var{p1} 的类型是
\type{Person}。

第二行：\lstinline{p2 := new(Person)} 分配了内存并且将\emph{指针}赋值给
\var{p2}。\var{p2} 的类型是 \type{*Person}。

\Question
在第二个函数中，\var{x} 指向一个新的（堆上分配的）变量
\var{t}，其包含了实际参数值的副本。

在第一个函数中，\var{x} 指向了 \var{t} 指向的内容，
也就是实际上的参数指向的内容。

因此在第二个函数，我们有了``额外''的变量存储了相关值的副本。
\end{Answer}
